package org.chimi.rr4s.domain;

import java.util.List;

import org.springframework.data.domain.Pageable;
import org.springframework.data.neo4j.annotation.Query;
import org.springframework.data.neo4j.repository.GraphRepository;

public interface ItemRepository extends GraphRepository<Item> {

	/**
	 * 특정 아이템을 본 사용자들이 본 다른 아이템 목록을 구함.
	 * 
	 * @param itemId
	 * @return
	 */
	@Query("start i=node:ITEM(id={0}) "
			+ "match i<-[:VIEWED]-user-[:VIEWED]->item "
			+ "return item, count(*) as count order by count desc ")
	public List<ItemResult> findViewedItemsTogether(String itemId,
			Pageable pageable);

	/**
	 * 특정 아이템을 좋아하는 사용자들이 좋아하는 다른 아이템 목록을 구함.
	 * 
	 * @param itemId
	 * @return
	 */
	@Query("start i=node:ITEM(id={0}) "
			+ "match i<-[:LIKED]-user-[:LIKED]->item "
			+ "return item, count(*) as count order by count desc")
	public List<ItemResult> findLikedItemsTogether(String itemId,
			Pageable pageable);

	/**
	 * 특정 아이템을 구매한 사용자들이 구매한 다른 아이템 목록을 구함.
	 * 
	 * @param itemId
	 * @return
	 */
	@Query("start i=node:ITEM(id={0}) "
			+ "match i<-[:BOUGHT]-user-[:BOUGHT]->item "
			+ "return item, count(*) as count order by count desc")
	public List<ItemResult> findBoughtItemsTogether(String itemId,
			Pageable pageable);

	/**
	 * 사용자와 같은 아이템을 본 다른 사용자가 본 아이템 목록을 구함.
	 * 
	 * @param userId
	 * @return
	 */
	@Query("start u=node:USERID(id={0}) "
			+ "match u-[:VIEWED]->i<-[:VIEWED]-otherUser-[:VIEWED]->item "
			+ "return item, count(*) as count order by count desc")
	public List<ItemResult> findAlsoViewedItemsForUserById(String userId,
			Pageable pageable);

	/**
	 * 사용자와 같은 아이템을 좋아한 다른 사용자가 본 아이템 목록을 구함.
	 * 
	 * @param userId
	 * @return
	 */
	@Query("start u=node:USERID(id={0}) "
			+ "match u-[:LIKED]->i<-[:LIKED]-otherUser-[:LIKED]->item "
			+ "return item, count(*) as count order by count desc")
	public List<ItemResult> findAlsoLikedItemsForUserById(String userId,
			Pageable pageable);

	/**
	 * 사용자와 같은 아이템을 좋아한 다른 사용자가 본 아이템 목록을 구함
	 * 
	 * @param userId
	 * @return
	 */
	@Query("start u=node:USERID(id={0}) "
			+ "match u-[:BOUGHT]->i<-[:BOUGHT]-otherUser-[:BOUGHT]->item "
			+ "return item, count(*) as count order by count desc")
	public List<ItemResult> findAlsoBoughtItemsForUserById(String userId,
			Pageable pageable);

}